using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace FreeImageNET_SFM
{
    class Program
    {
        static private Regex searchPattern = new Regex("#include[ \\t]*\"(.*)\"", RegexOptions.Compiled);
        static private FileStream fStream = null;
        static private TextWriter textOut = null;
        private const string baseFolder = @"..\..\..\Library\";
        private const string templateName = @"FreeImage.cs.template";

        static int Main(string[] args)
        {
            try
            {
                if (!File.Exists(templateName))
                {
                    Console.WriteLine(templateName + " not found."); return 1;
                }

                try
                {
                    fStream = new FileStream(@"FreeImage.cs", FileMode.Create);
                }
                catch
                {
                    Console.WriteLine("Unable to create output file."); return 2;
                }

                textOut = new StreamWriter(fStream);

                string[] content = File.ReadAllLines(templateName);

                for (int lineNumber = 0; lineNumber < content.Length; lineNumber++)
                {
                    string line = content[lineNumber].Trim();
                    Match match = searchPattern.Match(line);

                    if (match.Success && match.Groups.Count == 2 && match.Groups[1].Value != null)
                    {
                        if (!File.Exists(baseFolder + match.Groups[1].Value))
                        {
                            throw new FileNotFoundException(baseFolder + match.Groups[1].Value + " does not exist.");
                        }

                        ParseFile(baseFolder + match.Groups[1].Value);
                    }
                    else
                    {
                        textOut.WriteLine(content[lineNumber]);
                    }
                }

                return 0;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                //Console.WriteLine("Error while parsing.");
                return 3;
            }
            finally
            {
                if (textOut != null)
                {
                    textOut.Flush();
                    textOut.Close();
                }
            }
        }

        private static void ParseFile(string fileName)
        {
            int lineNumber = 0;
            string line;
            Match match;
            string[] content = File.ReadAllLines(fileName);

            if (fileName.Contains("AssemblyInfo.cs"))
            {
                while (content[lineNumber].Trim().StartsWith("using") && lineNumber < content.Length)
                {
                    lineNumber++;
                }
                lineNumber++;
            }
            else
            {
                while (!(content[lineNumber].Trim().StartsWith("namespace")) && lineNumber < content.Length)
                {
                    lineNumber++;
                }
                //lineNumber += 2;
            }

            for (; lineNumber < content.Length; lineNumber++)
            {
                line = content[lineNumber].Trim();
                match = searchPattern.Match(line);

                if (match.Success && match.Groups.Count == 2 && match.Groups[1].Value != null)
                {
                    if (!File.Exists(baseFolder + match.Groups[1].Value))
                    {
                        throw new FileNotFoundException(baseFolder + match.Groups[1].Value + " does not exist.");
                    }

                    ParseFile(baseFolder + match.Groups[1].Value);
                }
                else
                {
                    textOut.WriteLine(content[lineNumber]);
                }
            }
        }
    }
}